home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / BOBOLI.ZIP / SRC / TIMER.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-27  |  3.8 KB  |  134 lines

  1. /* TIMER functions.
  2.    Really a skeleton.  The timer procedure does nothing but set a flag that
  3.    one tick of the selected rate has passed, and keep track of how many such
  4.    ticks have occurred.  If you need to do more than that in your timer
  5.    function, then copy this file, and modify what the timer function does.
  6. */
  7.  
  8. #include <dpmi.h>
  9. #include "timer.h"
  10. #include "mgraph.h"
  11.  
  12. volatile byte timepassed,timetick;
  13. volatile unsigned short clock_ticks;
  14. volatile unsigned long counter;
  15. static _go32_dpmi_seginfo old_rm_timer_vector,
  16.               new_rm_timer_vector,
  17.               old_pm_timer_vector,
  18.               new_pm_timer_vector;
  19. static _go32_dpmi_registers _timer_r;
  20.  
  21. void pm_timer_handler(void);
  22. void rm_timer_handler(void);
  23. void timer_init(byte Hz)
  24. {
  25.   counter=_PIT_freq/Hz;
  26.   clock_ticks=0;
  27.   timetick=0;
  28.   timepassed=0;
  29.   new_pm_timer_vector.pm_selector=_go32_my_cs();
  30.   new_pm_timer_vector.pm_offset=(int) pm_timer_handler;
  31.   new_rm_timer_vector.pm_selector=_go32_my_cs();
  32.   new_rm_timer_vector.pm_offset=(int) rm_timer_handler;
  33.   disable();
  34.   _go32_dpmi_get_protected_mode_interrupt_vector(_Timer_intr,
  35.     &old_pm_timer_vector);
  36.   _go32_dpmi_chain_protected_mode_interrupt_vector(_Timer_intr,
  37.     &new_pm_timer_vector);
  38.   _go32_dpmi_allocate_real_mode_callback_iret(&new_rm_timer_vector, &_timer_r);
  39.   _go32_dpmi_get_real_mode_interrupt_vector(_Timer_intr, 
  40.     &old_rm_timer_vector);
  41.   outportb(0x43,0x34);
  42.   outportb(0x40,counter%256);
  43.   outportb(0x40,counter/256);
  44.   enable();
  45. }
  46.  
  47. void timer_exit(void)
  48. {
  49.   unsigned long tick;
  50.   char *cmostime;
  51.   disable();
  52.   outportb(0x43,0x36);
  53.   outportb(0x40,0);
  54.   outportb(0x40,0);
  55.   _go32_dpmi_set_real_mode_interrupt_vector(_Timer_intr, 
  56.     &old_rm_timer_vector);
  57.   _go32_dpmi_set_protected_mode_interrupt_vector(_Timer_intr, 
  58.     &old_pm_timer_vector);
  59.   _go32_dpmi_free_real_mode_callback(&new_rm_timer_vector);
  60.   enable();
  61.   /* irqs are restored, now fix the clock, if it's off */
  62.   cmostime = get_cmostime();
  63.   tick=18.2067597*((((float) *cmostime)*3600)+(((float)*(cmostime + 1))*60)+
  64.        (((float) *(cmostime + 2))));
  65.   biostime(1, tick);
  66. }
  67.  
  68. void qdelay(unsigned short time)
  69. {
  70.   unsigned short t;
  71.   for(t=1;t<=time;t++) inportb(0x388);
  72. }
  73.  
  74. void rm_timer_handler(void)
  75. {
  76.   disable();
  77.   timetick++;
  78.   timepassed=1;
  79.   clock_ticks+=counter;
  80.   if(clock_ticks>=0x10000) {
  81.     clock_ticks-=0x10000;
  82.     memset(&_timer_r, 0, sizeof(_timer_r));
  83.     _timer_r.x.cs = old_rm_timer_vector.rm_segment;
  84.     _timer_r.x.ip = old_rm_timer_vector.rm_offset;
  85.     _timer_r.x.ss = _timer_r.x.sp = 0;
  86.     enable();
  87.     _go32_dpmi_simulate_fcall_iret(&_timer_r);
  88.   }
  89.   else outportb(0x20,0x20);
  90. }
  91.  
  92. void pm_timer_handler(void)
  93. {
  94.   disable();
  95.   timetick++;
  96.   timepassed=1;
  97.   clock_ticks+=counter;
  98.   if(clock_ticks>=0x10000) {
  99.     clock_ticks-=0x10000;
  100.     memset(&_timer_r, 0, sizeof(_timer_r));
  101.     _timer_r.x.cs = old_pm_timer_vector.rm_segment;
  102.     _timer_r.x.ip = old_pm_timer_vector.rm_offset;
  103.     _timer_r.x.ss = _timer_r.x.sp = 0;
  104.     enable();
  105.     _go32_dpmi_simulate_fcall_iret(&_timer_r);
  106.   }
  107.   else outportb(0x20,0x20);
  108. }
  109.  
  110. char *get_cmostime(void)
  111. {
  112.     char           *buff;
  113.     static char     buffer[6];
  114.     char            ch;
  115.  
  116.     buff = buffer;
  117.     memset(&_timer_r, 0, sizeof(_timer_r));
  118.     _timer_r.h.ah = 0x02;
  119.     _go32_dpmi_simulate_int(0x1a, &_timer_r);
  120.            
  121.     ch = _timer_r.h.ch;
  122.     buffer[0] = (char) ((int) (ch & 0x0f) + (int) ((ch >> 4) & 0x0f) * 10);
  123.     ch = _timer_r.h.cl;
  124.     buffer[1] = (char) ((int) (ch & 0x0f) + (int) ((ch >> 4) & 0x0f) * 10);
  125.     ch = _timer_r.h.dh;
  126.     buffer[2] = (char) ((int) (ch & 0x0f) + (int) ((ch >> 4) & 0x0f) * 10);
  127.     buffer[3] = _timer_r.h.dl;
  128.     buffer[4] = (char) (_timer_r.x.flags & 0x0001);
  129.     buffer[5] = 0x00;
  130.  
  131.     return (buff);
  132. }
  133.  
  134.